package hh.util;

import com.google.common.math.IntMath;

import java.math.BigDecimal;

import static java.math.BigDecimal.ROUND_HALF_UP;

/**
 * 买包子
 * https://blog.csdn.net/ccnt_2012/article/details/81114920
 *
 * http://www.ruanyifeng.com/blog/2015/06/poisson-distribution.html
 *
 * https://blog.csdn.net/weixin_43883685/article/details/109809049
 */
public class 泊松分布 {
    /**
     * hashmap 泊松分布的公式
     * (exp(-0.5) * pow(0.5, k) /
     *      * factorial(k)). The first values a
     */
    public static void main(String[] args) {

        double d = 0;
        for (int i = 0; i < 9; i++) {
            d += position_distribution(i, 5);
        }

        System.out.println(format(d));
    }

    private static String format(double d) {
        return new BigDecimal(d+"").setScale(10, ROUND_HALF_UP).toPlainString();
    }

    /**
     * 例1：买包子
     * 一天有n个人买包子服从泊松分布
     * 平均每天卖5个  lambda=5
     * 那么，一天有5个人买包子的概率是多少？ 此时k=5
     * 一天有8个人买包子的概率是？ 此时k=8
     *
     * 例2: hashmap的bin(bucket)的大小服从泊松分布
     * hashmap中说了，0.75加载因子下，lambda=0.5，说明平均每个bin可以放0.5个元素
     *
     * 如果一个桶放5个元素的概率是？ 此时k=5
     * 如果一个桶放8个元素的概率是？此时k=8 (亿分之6)
     *
     *
     * @param k   期望数量
     * @param lambda  平均值
     * @return k的概率
     */
    private static double position_distribution(int k, double lambda) {

        return Math.exp(-lambda) * Math.pow(lambda, k) / IntMath.factorial(k);


    }


}
